package com.zmn.mcc.business.impl.dpermit.dept;

import com.zmn.common.utils.collection.CollectionUtil;
import com.zmn.manager.common.database.annotation.ReadOnlyConnection;
import com.zmn.mcc.business.interfaces.dpermit.dept.DpermitDeptBService;
import com.zmn.mcc.common.constant.DpermitConsts;
import com.zmn.mcc.manager.utils.DpermitUtil;
import com.zmn.mcc.model.dto.dpermit.DpermitSimpleDO;
import com.zmn.mcc.model.entity.dept.McDept;
import com.zmn.mcc.services.interfaces.dept.DeptService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author heguanghua
 * @since 2020/06/11 12:42
 */
@Service
public class DpermitDeptBServiceImpl implements DpermitDeptBService {
    protected Logger logger = LoggerFactory.getLogger(DpermitDeptBServiceImpl.class);

    @Resource
    private DeptService deptService;


    // region 取得全部一级、二级、三级部门列表，一级和二级并列，三级为二级的子集

    @Override
    @ReadOnlyConnection
    public List<DpermitSimpleDO> listDeptAndDpermitChecked(Integer orgId, Integer status, List<Integer> dpermitIds) {

        List<DpermitSimpleDO> items = new ArrayList<>();

        // 部门ID和简单部门对象的映射关系
        Map<Integer, DpermitSimpleDO> map = new HashMap<>(16);

        // 一级、二级、三级部门列表
        List<McDept> depts = deptService.listByOrgId(orgId, status);
        for(McDept dept: depts) {

            // 防止数据错误抛出异常
            if(dept.getLevel() == null) {
                continue;
            }

            // 简单部门对象
            DpermitSimpleDO simple = this.parseToDpermitSimpleDO(dept);

            // 加入映射关系map
            if(dept.getLevel() == DpermitConsts.DEPT_LEVEL_TWO) {
                map.put(simple.getDataId(), simple);
            }

            // 选中已分配
            if(CollectionUtil.isNotNullOrEmpty(dpermitIds) && dpermitIds.contains(simple.getDataId())) {
                simple.setChecked(true);
            }

            // 一级、二级加入主列表
            if(dept.getLevel() <= DpermitConsts.DEPT_LEVEL_TWO) {
                items.add(simple);
            }
            // 三级加入二级部门的子集
            else if(dept.getLevel() == DpermitConsts.DEPT_LEVEL_THRE) {
                DpermitSimpleDO parent = map.get(simple.getParentId());
                if(parent != null) {
                    parent.getSubors().add(simple);
                }
            }
        }

        return items;
    }
    // endregion

    // region 取得全部一级、二级、三级部门的层级列表
    
    @Override
    public List<DpermitSimpleDO> listDeptTreeAndDpermitChecked(Integer orgId, Integer status, List<Integer> dpermitIds) {

        List<DpermitSimpleDO> items = new ArrayList<>();

        // 部门ID和简单部门对象的映射关系
        Map<Integer, DpermitSimpleDO> map = new HashMap<>(16);

        // 一级、二级、三级部门列表
        List<McDept> depts = deptService.listByOrgId(orgId, status);
        for(McDept dept: depts) {

            // 防止数据错误抛出异常
            if(dept.getLevel() == null) {
                continue;
            }

            // 简单部门对象
            DpermitSimpleDO simple = this.parseToDpermitSimpleDO(dept);

            // 一级、二级加入映射关系map
            if(dept.getLevel() <= DpermitConsts.DEPT_LEVEL_TWO) {
                map.put(simple.getDataId(), simple);
            }

            // 选中已分配
            if(CollectionUtil.isNotNullOrEmpty(dpermitIds) && dpermitIds.contains(simple.getDataId())) {
                simple.setChecked(true);
            }

            // 一级加入主列表
            if(dept.getLevel() == DpermitConsts.DEPT_LEVEL_ONE) {
                items.add(simple);
            }
            // 加入上级部门的子集
            else if(dept.getLevel() > DpermitConsts.DEPT_LEVEL_ONE) {
                DpermitSimpleDO parent = map.get(simple.getParentId());
                if(parent != null) {
                    parent.getSubors().add(simple);
                }
            }
        }

        /**
         * 检查并处理简单数据对象选中状态
         * 下级部分选中则上级选中，下级全部选中则对上级标识
         */
        DpermitUtil.checkSelected(items, false);
        return items;
    }
    // endregion


    /**
     * 转换为简单数据权限对象
     * @param dept
     * @return
     */
    private DpermitSimpleDO parseToDpermitSimpleDO(McDept dept) {
        if(dept == null) {
            return null;
        }
        DpermitSimpleDO simple = new DpermitSimpleDO();
        simple.setDataId(dept.getDeptId());
        simple.setDataName(dept.getDeptName());
        simple.setParentId(dept.getParentId());
        simple.setStatus(dept.getStatus());
        simple.setLevel(dept.getLevel());
        return simple;
    }
}
